#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
LL a[N];
vector<int> edg[N];
// pre_max - 该节点前面最大的前缀交替和
// pre_min - 该节点前面最小的前缀交替和
// sum - 根节点到该节点的前缀交替和
// dep - 该节点的深度
LL pre_max[N], pre_min[N], dep[N], sum[N];
void dfs(int child, int fa)
{
    dep[child] = dep[fa] + 1;
    if(dep[child] % 2) sum[child] = sum[fa] + a[child]; 
    else sum[child] = sum[fa] - a[child];
    pre_max[child] = max(sum[child], pre_max[fa]);
    pre_min[child] = min(sum[child], pre_min[fa]);
    for(auto v : edg[child])
    {
        if(v == fa) continue;
        else dfs(v, child);
    }
}

void solve()
{
    int n; cin >> n;
    for(int i = 1; i <= n; i++) 
    {
        pre_max[i] = pre_min[i] = dep[i] = sum[i] = 0;
        edg[i].clear();
        cin >> a[i];
    }
    for(int i = 1; i < n; i++)
    {
        int x, y; cin >> x >> y;
        edg[x].push_back(y);
        edg[y].push_back(x);
    }
    dep[1] = 1;
    dfs(1, -1);
    for(int i = 1; i <= n; i++) 
    {
        // 奇数正常输出前缀减一个最小的
        if(dep[i] % 2) cout << sum[i] - pre_min[i] << " ";
        // 偶数输出前缀减一个最大的的相反数
        else cout << -(sum[i] - pre_max[i]) << " ";
    }
    cout << endl;
}

int main()
{
    int t; cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}